AVAsset
AVAsset 是对媒体资源(音频 / 视频)的重量级句柄,底层由 iOS AVURLAsset 支撑。你可以用它在不启动 AVPlayer 的前提下读取媒体属性、元数据、轨道信息,以及在任意时间点提取静帧。
也可以把一个 AVAsset 直接传给 AVPlayer.setSource(asset),这样元数据、轨道等已加载的信息可以在检查与播放之间共享。
入门指南
校验语义
构造器是有意"懒校验"的,与 iOS 原生 AVURLAsset 行为保持一致:
- 不校验文件是否存在
- 不校验 URL 是否可达
- 对远程 URL,只有在字符串本身非法(导致底层
URL(string:)返回 nil)时才会立即抛错 - 其他所有失败(404、网络错误、本地文件不存在、不识别的格式)都会在第一次调用
loadXxx()时通过 Promise reject 抛出
API 参考
构造函数
new AVAsset(filePathOrURL: string, options?: { headers?: Record<string, string> })
从本地文件路径或远程 http(s):// URL 创建一个 asset。
远程 URL 可以附带 HTTP headers(用于受保护内容):
属性
source: string
构造此 asset 时使用的原始路径或 URL 字符串,只读。
异步加载方法
所有 loadXxx() 方法都返回 Promise;失败(文件不存在 / URL 无法访问 / 格式不识别等)通过 Error 拒绝。
loadDuration(): Promise<MediaTime>
asset 的总时长。
loadIsPlayable(): Promise<boolean>
asset 是否可播放。
loadIsExportable(): Promise<boolean>
asset 是否可导出(例如通过 AVAssetExportSession)。
loadIsReadable(): Promise<boolean>
asset 的媒体数据是否可读。
loadHasProtectedContent(): Promise<boolean>
asset 是否包含 DRM 保护内容。
loadPreferredTransform(): Promise<{ a, b, c, d, tx, ty }>
视频部分渲染时使用的首选仿射变换(旋转 / 缩放 / 平移)的 6 个分量。
loadMetadata(): Promise<AVMetadataItem[] | null>
加载 asset 的全部元数据项。
loadCommonMetadata(): Promise<AVMetadataItem[] | null>
加载通用元数据项(每项带有 commonKey)。
轨道
loadTracks(mediaType?: AVMediaType): Promise<AVAssetTrack[]>
加载 asset 的轨道,可按媒体类型筛选。
AVMediaType 取值:
AVAssetTrack
静帧生成
generateImage(time, options?): Promise<{ image, actualTime }>
在单个请求时间点生成一张静帧。
generateImages(times, options?): Promise<...>
为一组时间点批量生成静帧。每个时间点的结果独立报告:成功条目带 image 和 actualTime;失败条目带 error。
AVAssetImageGenerateOptions
生命周期
dispose(): void
释放底层 AVURLAsset。释放后再次调用 loadXxx() 会被拒绝。脚本运行结束时未显式释放的 asset 会被自动清理。
与 AVPlayer 共享
AVPlayer.setSource(asset) 直接复用 asset 底层媒体,已加载的属性可以共享:
最佳实践
- 选对抽象层级 — 仅做检查时优先用
AVAsset而不是AVPlayer,避免引入播放机制 - 检查与播放共享 asset — 构造一次
AVAsset,再传给AVPlayer.setSource(asset) - 永远捕获 Promise 拒绝 — 错误从这里抛出,构造器不会
- 优先批量提帧 —
generateImages(times)比循环调用generateImage(time)更高效 - tolerance 用于换取速度 — 缩略图等场景下,给
toleranceBefore/After设个 0.5 秒左右通常比精确帧匹配快很多
